package com.tanhua.server.service;

import cn.hutool.crypto.SecureUtil;
import com.alibaba.fastjson.JSON;
import com.tanhua.autoconfig.template.HuanXinTemplate;
import com.tanhua.autoconfig.template.SmsTemplate;
import com.tanhua.commons.Constants;
import com.tanhua.commons.exception.TanHuaException;
import com.tanhua.commons.utils.JwtUtils;
import com.tanhua.dubbo.api.UserApi;
import com.tanhua.model.db.User;
import com.tanhua.model.vo.ErrorResult;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * 用户处理业务类 只有实现类 没有接口（如果需要业务处理 都调用服务提供者）
 */
@Service
@Slf4j
public class UserService {

    //方式一
    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    //方式二
    //@Autowired
    //private StringRedisTemplate stringRedisTemplate;

    @Autowired
    private SmsTemplate smsTemplate;

    @DubboReference
    private UserApi userApi;

    @Autowired
    private HuanXinTemplate huanXinTemplate;


    /**
     * 登录---获取验证码
     * @param phone
     */
    public void sendCode(String phone) {
        log.debug("*************手机号{}*******************",phone);
        String key = "VALIDATE_CODE_"+phone;//如果仅仅是手机号 无法区别验证码对应的业务功能
        //1根据key查询redis是否有验证码
        String redisCode = redisTemplate.opsForValue().get(key);
        //2如果有值，告知用户验证码未失效，请输入验证码
        if(StringUtils.isNotEmpty(redisCode)){
            throw new TanHuaException(ErrorResult.duplicate());
        }
        //3如果没有值，生成验证码 并调用短信接口发送短信到手机上
        //String randomNum = RandomStringUtils.randomNumeric(6);//4 or 6
        String randomNum = "111111";//4 or 6
        log.debug("*************手机号{}*********验证码{}**********",phone,randomNum);
        if(false) {
            smsTemplate.sendSms(phone, randomNum);
        }
        //4将验证码存入redis 5分钟有效
        redisTemplate.opsForValue().set(key,randomNum,5, TimeUnit.MINUTES);
        log.debug("************发送验证码成功了*******************");
    }

    /**
     * 登录---验证码校验
     * verificationCode：用户输入的验证码
     */
    public Map login(String phone, String verificationCode) {
        String key = "VALIDATE_CODE_"+phone;
        //1根据key查询redis是否有验证码
        String redisCode = redisTemplate.opsForValue().get(key);
        //2如果没有 说明验证码已经失效了
        if(StringUtils.isEmpty(redisCode)){
            throw new TanHuaException(ErrorResult.loginError());
        }
        //3如果有 redis存入的验证码 跟用户输入的验证码 进行对比
        if(!redisCode.equals(verificationCode)){
            //4如果不一样 说明用户输入的验证码错误 则不能登录或注册
            throw new TanHuaException(ErrorResult.validateCodeError());
        }
        //5如果一样，说明可以登录或注册
        boolean isNew = false;//false：老用户
        //5.1 根据手机查询tb_user表看用户是否存在
        User user = userApi.findByMobile(phone);
        //6 如果用户不存在 则自动注册tb_user
        if(null == user){
            user = new User();
            user.setMobile(phone);//手机号
            String password = phone.substring(5);
            // 密码加密
            password = SecureUtil.md5(password);
            user.setPassword(password);
            //user.setCreated(); 1.tanhua-dubbo-db自动填充类 2.tanhua-model BasePojo 3.User extends BasePojo
            //user.setUpdated();  mybatisplus自动填充  copy
            Long userId = userApi.add(user);
            user.setId(userId);
            isNew = true;
            //6.1 完成tanhua数据注册后，需要调用第三方环信注册
            //username:  password:123456
            Boolean isCreate = huanXinTemplate.createUser(Constants.HX_USER_PREFIX + userId, "123456");
            if(!isCreate){
                log.debug("调用环信云创建用户失败了*****用户id****{}*************",userId);
            }else {
                //6.2 将注册用户对应的环信账号 密码保存tb_user表中
                user.setHxUser(Constants.HX_USER_PREFIX + userId);
                user.setHxPassword("123456");
                userApi.update(user);
                log.debug("调用环信云创建用户成功了*****用户id****{}*************",userId);
            }
        }
        //7将redis验证码删除 验证码已经使用了
        redisTemplate.delete(key);
        //8 生成token(单独分析)
        String token = JwtUtils.createToken(user.getId(), phone);
        //8.1 存入redis
        //tokenKey:token字符串  value:用户对象字符串
        String tokenKey = "TOKEN_"+token;
        //将user对象转为字符串
        String userStr = JSON.toJSONString(user);
        redisTemplate.opsForValue().set(tokenKey,userStr,1,TimeUnit.DAYS); //登录设置有效期1天
        //9 将isNew token封装Map返回给app
        Map map = new HashMap();
        map.put("token",token);
        map.put("isNew",isNew);
        return map;
    }
}
